package com.doubao.wechat.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doubao.wechat.entity.PaymentOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 支付订单Mapper接口
 */
@Mapper
public interface PaymentOrderMapper extends BaseMapper<PaymentOrder> {

    /**
     * 根据商户订单号查询支付订单
     * @param outTradeNo 商户订单号
     * @return 支付订单
     */
    PaymentOrder selectByOutTradeNo(@Param("outTradeNo") String outTradeNo);

    /**
     * 根据商户订单号和用户ID查询支付订单
     * @param outTradeNo 商户订单号
     * @param userId 用户ID
     * @return 支付订单
     */
    @Select("SELECT * FROM payment_order WHERE out_trade_no = #{outTradeNo} AND user_id = #{userId} LIMIT 1")
    PaymentOrder selectByOutTradeNoAndUserId(@Param("outTradeNo") String outTradeNo, @Param("userId") Long userId);

    /**
     * 根据第三方交易号查询支付订单
     * @param tradeNo 第三方交易号
     * @return 支付订单
     */
    PaymentOrder selectByTradeNo(@Param("tradeNo") String tradeNo);

    /**
     * 更新支付成功状态
     * @param outTradeNo 商户订单号
     * @param tradeNo 第三方交易号
     * @param status 支付状态
     * @return 更新结果
     */
    int updatePaySuccess(@Param("outTradeNo") String outTradeNo,
                         @Param("tradeNo") String tradeNo,
                         @Param("status") String status);
 
    /**
     * 更新订单状态
     * @param outTradeNo 商户订单号
     * @param status 订单状态
     * @return 更新结果
     */
    int updateStatusByOutTradeNo(@Param("outTradeNo") String outTradeNo,
                                 @Param("status") String status);

    /**
     * 查询最近的待支付订单
     * @param afterTime 时间范围
     * @return 订单列表
     */
    List<PaymentOrder> findRecentWaitPayOrders(@Param("afterTime") LocalDateTime afterTime);

    /**
     * 查询最近的VIP待支付订单
     * @param afterTime 时间范围
     * @return 订单列表
     */
    List<PaymentOrder> findRecentVipWaitPayOrders(@Param("afterTime") LocalDateTime afterTime);

    /**
     * 根据用户ID查询订单列表
     * @param userId 用户ID
     * @param status 订单状态（可选）
     * @return 订单列表
     */
    List<PaymentOrder> findOrdersByUserId(@Param("userId") Long userId,
                                          @Param("status") String status);

    /**
     * 批量更新过期订单状态
     * @param expireTime 过期时间
     * @return 更新数量
     */
    int updateExpiredOrders(@Param("expireTime") LocalDateTime expireTime);

    /**
     * 统计用户订单数量
     * @param userId 用户ID
     * @param status 订单状态
     * @return 订单数量
     */
    int countUserOrders(@Param("userId") Long userId, @Param("status") String status);

    /**
     * 查询指定时间范围内的订单
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 订单状态
     * @return 订单列表
     */
    List<PaymentOrder> findOrdersByTimeRange(@Param("startTime") LocalDateTime startTime,
                                             @Param("endTime") LocalDateTime endTime,
                                             @Param("status") String status);

    /**
     * 取消订单
     * @param outTradeNo 商户订单号
     * @param cancelReason 取消原因
     * @return 更新结果
     */
    int cancelOrder(@Param("outTradeNo") String outTradeNo, @Param("cancelReason") String cancelReason);
}